#include <ncurses.h>
#include "ncurJeu.h"
#include <assert.h>




void ncursAff( WINDOW* win, const Jeu *pJeu,const int numJoueur)
{
    int x,y,i,j;
    Terrain *pTer;
    Chevalet *pChev;

    pTer=jeuGetTerrain(pJeu);
    pChev=jeuGetChev(pJeu);

    wclear(win);

    for(j=0;j<pJeu->nbJoueurs;j++)
        {
            mvwprintw(win,j,0,"%s : %d points",pJeu->tabJoueurs[j]->nomJoueur, pJeu->tabJoueurs[j]->score);
        }

    for(x=0;x<getDim(pTer);x++)
    {
        for(y=0;y<getDim(pTer);y++)
        {
            mvwprintw(win,y+pJeu->nbJoueurs, x, "%c",terGetXY(pTer,x,y) );
        }
    }

        for(i=0;i<6;i++)
        {
           mvwprintw(win,getDim(pTer)+pJeu->nbJoueurs, i, "%c",chevGetLettre(pChev,i));
        }

}

void boucleTexteJeu( WINDOW* win, Jeu *pJeu,int numJoueur,int i,int *x, int *y)
{
    int indice,posValide;
    char lettreJoue;
    Terrain *pTer;
    Chevalet *pChev;


    pTer=jeuGetTerrain(pJeu);
    pChev=jeuGetChev(pJeu);



   mvwprintw(win,0+pJeu->nbJoueurs,getDim(pTer)+5,"C'est au tour de %s",pJeu->tabJoueurs[numJoueur-1]->nomJoueur);

   mvwprintw(win,2+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez la ligne sur laquelle vous voulez jouer\n");
     mvwscanw(win,3+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&y[i]);

    mvwprintw(win,4+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez la colonne sur laquelle vous voulez jouer\n");
     mvwscanw(win,5+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&x[i]);


     posValide=terPositionValide(pTer,x[i],y[i]);
     if(posValide==0)
        {

            ncursAff( win, pJeu,numJoueur);
               mvwprintw(win,0+pJeu->nbJoueurs,getDim(pTer)+5,"Erreur, case occupée  rejouez %s",pJeu->tabJoueurs[numJoueur-1]->nomJoueur);

               mvwprintw(win,2+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez la ligne sur laquelle vous voulez jouer\n");
                 mvwscanw(win,3+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&y[i]);

                mvwprintw(win,4+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez la colonne sur laquelle vous voulez jouer\n");
                 mvwscanw(win,5+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&x[i]);
     }

   mvwprintw(win,6+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez l'indice de la lettre que vous voulez utiliser\n");
     mvwscanw(win,7+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&indice);
     indice --;
   lettreJoue=chevGetLettre(pChev,indice);
   if(lettreJoue=='\0')
    {

      ncursAff( win, pJeu,numJoueur);
      mvwprintw(win,0+pJeu->nbJoueurs,getDim(pTer)+5,"Erreur cette lettre n'existe pas");

         mvwprintw(win,2+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez la ligne sur laquelle vous voulez jouer\n");
         mvwscanw(win,3+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&y[i]);

         mvwprintw(win,4+pJeu->nbJoueurs,getDim(pTer)+5,"Entrez la colonne sur laquelle vous voulez jouer\n");
         mvwscanw(win,5+pJeu->nbJoueurs,getDim(pTer)+5,"%d",&x[i]);
     }
    else
    {
        terSetXY(pTer,x[i],y[i],lettreJoue);
       chevSuppLettre(pChev,indice);
    }

}




void ncursBoucle(Jeu * pJeu)
{
    WINDOW *win,*screen;
    int continue_boucle,numJoueur,score,i,j,formeUnMot,motRaccorde; /* i de stocker les coordonnées de chaque lettres posées */
    int indiceRetourChev,chercheOuPoserLettre,tour;
    char cont,lettre;
    Terrain * pTer;
    Chevalet * pChev;
    int x[6],y[6];


      pTer=jeuGetTerrain(pJeu);
      pChev=jeuGetChev(pJeu);
      continue_boucle=1;
      numJoueur=1;
      score=0;
      i=0;
      tour=0;

    screen=initscr();
    clear();
	cbreak();

	win=newwin(10*getDim(jeuGetTerrain(pJeu)), 10*getDim(jeuGetTerrain(pJeu)), 0,15);
     ncursAff( win, pJeu,numJoueur);

    /*Cas du premier joueur, et premier tour*/

     do
     {
        boucleTexteJeu(win,pJeu,numJoueur,i, x,y);
        score++;
        i++;

          mvwprintw(win,8+pJeu->nbJoueurs,getDim(pTer)+5,"Voulez-vous placer une autre lettre? (O/N) \n");
          mvwscanw(win,9+pJeu->nbJoueurs,getDim(pTer)+5,"%c",&cont);
          ncursAff( win, pJeu,numJoueur);

    if(cont=='N') {
         formeUnMot=verifFormeMot(x,y,i,pTer);

           if(formeUnMot==0)
            {

                 mvwprintw(win,11+pJeu->nbJoueurs,getDim(pTer)+5,"Vos lettres doivent être alignés. Vous perdez votre tour");
                ncursAff( win, pJeu,numJoueur);
                refresh();
                score=0;
                remettreLettreDansChev(pTer,pChev,x,y,i);
                i=0;
            }

          /*si on ne joue pas sur la case centrale*/
       else if(verifJoueEtoile(x,y,i)==0)
        {
            mvwprintw(win,10+pJeu->nbJoueurs,getDim(pTer)+5,"Vous deviez jouer sur la case centrale, vous perdez votre tour\n");

            /*On remet le score à 0*/
            ncursAff( win, pJeu,numJoueur);
            refresh();
            score=0;
            remettreLettreDansChev(pTer,pChev,x,y,i);
            i=0;

            /* On supprime les lettres que le joueur à posé*/

        }


        else
        {

          for(j=0;j<i;j++)
          {
              lettre=terGetXY(pTer,x[j],y[j]);

                if(lettre>=97 && lettre <=122)
                {
                    lettre=lettre-32;
                }
                terSetXY(pTer,x[j],y[j],lettre);
          }

         setScore(pJeu->tabJoueurs[numJoueur-1],score+pJeu->tabJoueurs[numJoueur-1]->score);
            if(numJoueur==pJeu->nbJoueurs) {numJoueur=1;}
            else {numJoueur++; }
                score=0;
                chevRemplir(pChev);

            for(j=0;j<6;j++)
              {
                x[j]=-1;
                y[j]=-1;
              }
                i=0;
                tour++;
        }
    }
ncursAff( win, pJeu,numJoueur);
refresh();
 } while(tour==0);



        do
        {


          boucleTexteJeu(win,pJeu,numJoueur,i, x,y);
          score++;
          i++;
          mvwprintw(win,8+pJeu->nbJoueurs,getDim(pTer)+5,"Voulez-vous placer une autre lettre? (O/N) \n");

               mvwscanw(win,9+pJeu->nbJoueurs,getDim(pTer)+5,"%c",&cont);
               cont=toupper(cont);

               ncursAff( win, pJeu,numJoueur);
               refresh();

                   if(cont=='N') {
                     formeUnMot=verifFormeMot(x,y,i,pTer);
                       if(formeUnMot==0)
                      {
                        mvwprintw(win,11+pJeu->nbJoueurs,getDim(pTer)+5,"Vos lettres doivent être alignés. Vous perdez votre tour");
                        ncursAff( win, pJeu,numJoueur);
                        refresh();
                        score=0;
                        remettreLettreDansChev(pTer,pChev,x,y,i);
                        i=0;
                      }
                      else
                      {
                          motRaccorde=verifMotRaccorde(pTer,x,y,i);
                          if(motRaccorde==0)
                          {
                              mvwprintw(win,1+pJeu->nbJoueurs,getDim(pTer)+5,"Votre mot doit être raccordé.\n Vous perdez votre tour");
                              score=0;
                              ncursAff( win, pJeu,numJoueur);
                              remettreLettreDansChev(pTer,pChev,x,y,i);
                              i=0;
                          }
                          else if(verifMotDico(x,y,formeUnMot,pTer,i)==0)
                          {
                              mvwprintw(win,1+pJeu->nbJoueurs,getDim(pTer)+5,"Votre n'existe pas dans le dictionnaire.\n Vous perdez votre tour");
                              score=0;
                              ncursAff( win, pJeu,numJoueur);
                              remettreLettreDansChev(pTer,pChev,x,y,i);
                               i=0;
                          }
                          else
                          {
                              for(j=0;j<i;j++)
                              {
                                  lettre=terGetXY(pTer,x[j],y[j]);

                                    if(lettre>=97 && lettre <=122)
                                    {
                                        lettre=lettre-32;
                                    }
                                terSetXY(pTer,x[j],y[j],lettre);
                              }
                        /* on teste si c'est une case vortex: si c'est le cas on réinitialise le terrain et le chevalet*/
                         if(caseVortex(x,y,i)==1) {reInitTer(pJeu); reInitChev(pJeu); tour=0;}
                          }
                      }
                     setScore(pJeu->tabJoueurs[numJoueur-1],score+pJeu->tabJoueurs[numJoueur-1]->score);
                     if(getScore(pJeu->tabJoueurs[numJoueur-1])>=25)
                      {
                          mvwprintw(win,1+pJeu->nbJoueurs,getDim(pTer)+5,"!!!!! Victoire !!!");
                          mvwprintw(win,2+pJeu->nbJoueurs,getDim(pTer)+5,"Bien joué, %s",pJeu->tabJoueurs[numJoueur-1]->nomJoueur);
                          continue_boucle=0;
                      }
                    if(numJoueur==pJeu->nbJoueurs) {numJoueur=1;}
                    else
                       {numJoueur++; }
                    chevRemplir(pChev);
                    for(j=0;j<6;j++)
                       {
                           x[j]=-1;
                           y[j]=-1;
                       }
                       score=0;
                      i=0;
                   }

            ncursAff( win, pJeu,numJoueur);
            refresh();

        } while (continue_boucle==1);

        jeuLib(pJeu);
        assert(delwin(win)!=ERR);
        assert(delwin(screen)!=ERR);


    endwin();
}

